
package ligafutbol;

 /**@author M.Vivó*/
 
import com.mysql.jdbc.CallableStatement;
import java.io.*;
import java.sql.*;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class LigaFutbol {
    
    public static Scanner sc=new Scanner(System.in);
    
    public static void main(String[] args) {
        Connection con=conexionMySQL();
        File f1=new File("jugadores.txt");
        File f2=new File("equipos.txt");
        volcarJugadores(con, f1);
        crearTablaEquipo(con);
        crearTablaJugador(con);
        int opcion=0;
        
        do{
            opcion=menu();
            switch(opcion){
                case 1: addEquipo(con);break;
                case 2: sc.nextLine();addJugador(con);break;
                case 3: verEquipos(con);break;
                case 4: verJugadores(con);break;
                case 5: sc.nextLine();verJugadoresEquipo(con);break;
                case 6: sc.nextLine();actualizarEdadJugador(con);break;
                case 7: sc.nextLine();eliminarJugadoresEquipo(con);break;
                case 8: ejecutarProcAlmacenado(con);break;
            }
        
        }while(opcion!=9);
        
        try{
            con.close();
        }catch(Exception e){
            System.out.println("¡Erroooor!");
        }
    }
    
    
    public static int menu(){
        System.out.println("Menú:");
        System.out.println("1. Añadir equipo.");
        System.out.println("2. Añadir jugador.");
        System.out.println("3. Ver equipos.");
        System.out.println("4. Ver jugadores. ");
        System.out.println("5. Ver jugadores de un determinado equipo.");
        System.out.println("6. Cambiar edad de un jugador.");
        System.out.println("7. Eliminar jugadores de un determinado equipo.");
        System.out.println("8. Contar jugadores.");
        System.out.println("9. Salir.");
        System.out.print("Tu opción: ");
        
        int opcion=sc.nextInt();
        return opcion;
    }
    
    public static Connection conexionMySQL(){
        Connection con=null;
        
        try {
            
            //Class.forName("com.mysql.jdbc.driver"); /*Esta linea es opcional al cargar el driver desde NetBeans*/
            con=DriverManager.getConnection("jdbc:mysql://localhost/ligafutbol","root",""); /*Esto crea la conexion con el servidor SQL, en concreto para la base de datos de "liga"*/
            System.out.println("Conexión Correcta.");
            
        } catch (SQLException ex) {
            
            System.out.println("Error en la conexion SQL: " + ex.getMessage());
            
        }
        return con;
    }

    public static void crearTablaEquipo(Connection con){
        Statement stmt=null;
        String sSQL="CREATE TABLE IF NOT EXISTS equipo(id_equipo INT PRIMARY KEY,nombre varchar(50),estadio varchar(50),poblacion varchar(50),codigo_postal char(5));";
        try {
            stmt=con.createStatement();
            stmt.executeUpdate(sSQL);
            stmt.close();
        } catch (SQLException ex) {
            System.out.println("Error: "+ex.getMessage());
        }
    }
    
    public static void crearTablaJugador(Connection con){
        Statement stmt=null;
        String sSQL="CREATE TABLE IF NOT EXISTS jugador(id_jugador INT PRIMARY KEY AUTO_INCREMENT,nombre varchar(50),dorsal int,edad int,equipo int,FOREIGN KEY(equipo) references equipo(id_equipo));";
         try {
            stmt=con.createStatement();
            stmt.executeUpdate(sSQL);
            stmt.close();
        } catch (SQLException ex) {
            System.out.println("Error: "+ex.getMessage());
        }
    }
    
    public static void addEquipo(Connection con){
        int id_equipo;
        String nombre;
        String estadio;
        String poblacion;
        int codigo_postal;
        System.out.println("Introduce los datos del equipo: ");
        System.out.print("ID: ");
        id_equipo=sc.nextInt();
        sc.nextLine();
        System.out.print("Nombre: ");
        nombre=sc.nextLine();
        System.out.print("Estadio: ");
        estadio=sc.nextLine();
        System.out.print("Poblacion: ");
        poblacion=sc.nextLine();
        System.out.print("Codigo Postal: ");
        codigo_postal=sc.nextInt();
        Statement stmt=null;
        String sSQL="INSERT INTO equipo VALUES("+id_equipo+",'"+nombre+"','"+estadio+"','"+poblacion+"',"+codigo_postal+");";
        try {
            stmt=con.createStatement();
            stmt.executeUpdate(sSQL);
            System.out.println("\n¡Añadido con éxito!\n");
            stmt.close();
        } catch (SQLException ex) {
            System.out.println("Error: "+ex.getMessage());
        }
        
    }
    public static void addJugador(Connection con){
        String nombre;
        int dorsal;
        int edad;
        int equipo;
        System.out.println("Introduce los datos del Jugador: ");
        System.out.print("Introduce el nombre: ");
        nombre=sc.nextLine();
        //sc.nextLine();
        System.out.print("Introduce el dorsal: ");
        dorsal=sc.nextInt();
        System.out.print("Introduce la edad: ");
        edad=sc.nextInt();
        System.out.print("Introduce el id del equipo: ");
        equipo=sc.nextInt();
        
        Statement stmt=null;
        String sSQL="INSERT INTO jugador(nombre,dorsal,edad,equipo) VALUES('"+nombre+"',"+dorsal+","+edad+","+equipo+");";
        try{
            stmt=con.createStatement();
            stmt.executeUpdate(sSQL);
            System.out.println("Añadido con éxito.");
            stmt.close();
        }catch(SQLException ex){
            System.out.println("¿Existe el ID del equipo que has intentado introducir?");
        }
        
    }
    
    public static void verEquipos(Connection con){
        Statement stmt=null;
        String sSQL="SELECT * FROM equipo;";
        try {
            stmt=con.createStatement();
            ResultSet rs=stmt.executeQuery(sSQL);
            while(rs.next()){
                System.out.println("Equipos:\n");
                System.out.println("ID: "+rs.getInt("id_equipo"));
                System.out.println("Nombre: "+rs.getString("nombre"));
                System.out.println("Estadio: "+rs.getString("estadio"));
                System.out.println("Poblacion: "+rs.getString("poblacion"));
                System.out.println("Codigo Postal: "+rs.getInt("codigo_postal"));
                System.out.println("");
            }
            stmt.close();
        } catch (SQLException ex) {
            System.out.println("Error: "+ex.getMessage());;
        }
    }
    
    public static void verJugadores(Connection con){
        Statement stmt=null;
        String sSQL="SELECT * FROM jugador;";
        try {
            stmt=con.createStatement();
            ResultSet rs=stmt.executeQuery(sSQL);
            while(rs.next()){
                System.out.println("\nJugadores:\n");
                System.out.println("ID: "+rs.getInt("id_jugador"));
                System.out.println("Nombre: "+rs.getString("nombre"));
                System.out.println("Dorsal: "+rs.getInt("dorsal"));
                System.out.println("Edad: "+rs.getInt("edad"));
                System.out.println("Equipo: "+rs.getInt("equipo"));
                System.out.println("");
            }
            stmt.close();
        } catch (SQLException ex) {
            System.out.println("Error: "+ex.getMessage());;
        }
    }
    
    public static void verJugadoresEquipo(Connection con){
        Statement stmt=null;
        System.out.print("Introduce el nombre del equipo: ");
        String equipo=sc.nextLine();
        String sSQL="SELECT * FROM jugador WHERE equipo=(SELECT id_equipo FROM equipo WHERE nombre='"+equipo+"');";
        try {
            stmt=con.createStatement();
            ResultSet rs=stmt.executeQuery(sSQL);
            while(rs.next()){
                System.out.println("\nJugadores del equipo "+equipo+":\n");
                System.out.println("ID: "+rs.getInt("id_jugador"));
                System.out.println("Nombre: "+rs.getString("nombre"));
                System.out.println("Dorsal: "+rs.getInt("dorsal"));
                System.out.println("Edad: "+rs.getInt("edad"));
                System.out.println("Equipo: "+rs.getInt("equipo"));
                System.out.println("");
            }
            stmt.close();
        } catch (SQLException ex) {
            System.out.println("Error: "+ex.getMessage());;
        }
    }
    
    /*Este método será con PreparedStatement: */
    public static void actualizarEdadJugador(Connection con){
        PreparedStatement stmt=null;
        int edad;
        int id_jugador;
        String sSQL="UPDATE jugador SET edad = ? WHERE id_jugador=?;";
        System.out.println("\nIntroduce los datos del jugador a actualizar: ");
        System.out.print("Introduce su id: ");
        id_jugador=sc.nextInt();
        System.out.print("Introduce su nueva edad: ");
        edad=sc.nextInt();
        
        try{
            stmt=con.prepareStatement(sSQL);
            stmt.setInt(1, edad);
            stmt.setInt(2, id_jugador);
            stmt.executeUpdate();
            System.out.println("\n¡Dato actualizado!\n");
            stmt.close();
        }catch(SQLException ex){
            System.out.println("Error: "+ex.getMessage());
        }
    }
    
    public static void eliminarJugadoresEquipo(Connection con){
        String sSQL="DELETE FROM jugador WHERE equipo=(SELECT id_equipo FROM equipo WHERE nombre=?);";
        PreparedStatement stmt=null;
        String equipo;
        System.out.print("Dame el nombre del equipo cuyo jugadores quieras borrar: ");
        equipo=sc.nextLine();
         try{
            stmt=con.prepareStatement(sSQL);
            stmt.setString(1, equipo);
            stmt.executeUpdate();
            System.out.println("\n¡Jugadores eliminados!\n");
            stmt.close();
        }catch(SQLException ex){
            System.out.println("Error: "+ex.getMessage());
        }
        
    }

    /*Este método será para probar los procesos almacenados: */
    public static void ejecutarProcAlmacenado(Connection con){
        try{
            java.sql.CallableStatement cs= con.prepareCall("{call cuantosJugadores}");
            cs.execute();
            
            ResultSet rs=cs.getResultSet();
            
            while(rs.next()){
                System.out.println("\nEl numero de jugadores es: "+rs.getInt(1)+"\n");
            }
            
        }catch(SQLException ex){
            System.out.println("Error: "+ex.getMessage());
        }
    }
    
    public static void volcarJugadores(Connection con, File f){
        Statement stmt=null;
        String sSQL="SELECT * FROM jugador;";
        try {
            stmt=con.createStatement();
            ResultSet rs=stmt.executeQuery(sSQL);
            FileWriter es=new FileWriter(f,true);
            es.write("\nJugadores:\n");
            while(rs.next()){
                es.write("ID: "+rs.getInt("id_jugador")+" ");
                es.write("Nombre: "+rs.getString("nombre")+" ");
                es.write("Dorsal: "+rs.getInt("dorsal")+" ");
                es.write("Edad: "+rs.getInt("edad")+" ");
                es.write("Equipo: "+rs.getInt("equipo")+" ");
                es.write("\n");
            }
            stmt.close();
            es.close();
        } catch (SQLException ex) {
            System.out.println("Error: "+ex.getMessage());
        } catch (FileNotFoundException ex) {
            System.out.println("Error: "+ex.getMessage());
        } catch (IOException ex) {
            System.out.println("Error: "+ex.getMessage());
        }
    }
}
